"""
3.1 创建列表
3.1.1 列表的基本概念
如果要描述一个多维度的复杂事物，往往需要几个甚至几十个数据，例如：如果要记录
一名学生的成绩，至少需要学生姓名和考试成绩 2 个数据，同步的需要 2 个变量来存储和管
理这 2 个数据。
"""

"""
【示例 3.1.1.2】使用列表储存学生姓名和学生考试成绩。
"""
student_list = ['李明',20]
print(f'学生成绩列表:{student_list}')
print("*" * 100)


"""
3.1.2 直接创建列表
本知识点主要学习如何使用现有数据来直接创建列表，语法格式如下：
列表变量名 = [数据 1, 数据 2, 数据 3]
使用现有数据直接创建列表时，整个列表用一对方括号“[ ]”括起来，列表内部的每一个
数据称为列表的元素，多个元素之间用英文逗号“,”隔开，最后一个元素后面不加逗号。
"""
"""
【示例 3.1.2.1】直接使用简单类型数据变量创建列表，输出列表的原始数据形态。
"""
# student_name = input("输入学生姓名:")
student_name = "张三"
# student_score = input("输入学生成绩:")
student_score = 80
# student_male = bool(input("输入学生性别:1.男生 2.女生"))
student_male = True
student_list = [student_name, student_score, student_male]
print(f'学生成绩列表为:{student_list}') 

print("*" * 100)

"""
3.1.3 使用内置函数 list()创建列表
本知识点主要学习通过 Python 内置函数 list()来创建列表，语法格式如下：
列表变量名 = list(可迭代对象)
需要注意的是：list()函数也可以不接收可迭代对象作为实际参数，结果会返回一个空列
表；若空列表本身被直接用作 if 语句或 while 语句的条件判断，结果会返回 False。
"""
"""
【示例 3.1.3.1】通过内置函数 list()创建列表。
"""
blankList = list() #创建了 1 个空列表

if blankList:
    print('这不是一个空列表')
else:
    print(f'这是一个空列表：{blankList}')
helloList = list("HELLO") #创建了一个字符列表
# 通过format方式将helloList对应的数据类型借助type()实现，从而确定helloList将“HELLO”的字符串转变为字符列表
print(f'{helloList}的类型是：{type(helloList)}')
print("*" * 100)

"""
3.2 访问列表
本知识点主要学习如何访问列表。Python 列表是一种线性、有序的数据结构，掌握列表
内部元素的排列规律，就可以根据实际需要，从列表中取得需要的数据。
3.2.1 使用索引访问列表元素
1. 列表长度
本知识点学习列表长度的概念和如何计算列表长度。列表的长度就是列表内包含元素的
总数，列表的长度标记了列表可以被访问的边界。Python 语言提供了内置函数 len()来自动
计算列表的长度，语法格式如下：
列表长度 = len(列表变量名)
需要提出的是：len()函数不仅可以计算列表的长度，也可以计算本书后续章节将要讲解
的元组结构的长度。
"""

"""
【示例 3.2.1.1】通过内置函数 len()来获取列表长度。
"""
helloList = list("HELLO")
helloListLength = len(helloList)
print(f'helloList={helloList}一共包含{helloListLength}个元素。')
studentList = ['李明', 80, True]
studentListLength = len(studentList)
print(f'列表 studentList={studentList}一共包含{studentListLength}个元素。')
print("*" * 100)

"""
2. 列表索引
列表通过索引（英文：index）来标记内部元素的存储位置，索引实际上就是列表内元素
的编号。列表中每个元素的索引都是唯一的，只与该元素的存放位置有关，与添加顺序、大
小无关。如图 3-1 所示，helloList 列表的正向索引从左向右从 0 开始依次编号，向右移动 1
次，元素索引加 1，最大索引等于列表长度减去 1；反向索引从右向左从-1 开始依次编号，
向左移动 1 次索引号减去 1，最小索引等于列表长度的相反数。
需要注意的是：正向索引都是非负数，反向索引都是负数，在实际使用时要注意区分；
通过索引访问列表元素时，提供的元素正向索引不可以大于列表最右元素的索引值（反向索
引不可以小于最左侧元素的索引值），否则 Python 解释器会返回错误信息并终止程序。
"""
"""
【示例 3.2.1.2】通过元素的索引打印输出列表中的元素。
"""
studentList = ['小红', 90, False]
studentName = studentList[0] #学生姓名
studentScore = studentList[-2] #学生成绩
studentSex = '男生' if studentList[2] else '女生' #True 为男生，False 为女生
print(f'{studentSex}{studentName}的考试成绩为{studentScore}分。')
print("*" * 100)

"""
3.2.2 通过元素值获得列表索引
1. 列表的“in/not in”运算符
如果要判断列表是否包含特定的元素，Python 提供了关键字“in”和“not in”用于测试某元
素是否包含在列表中，测试返回布尔值：True 表示列表包含该元素，False 表示列表不包含
该元素。相关语法格式如下：
布尔值结果 = 元素 in | not in 列表变量名
"""
"""
【示例 3.2.2.1】通过使用关键字“in”和“not in”来判断列表 studentList 中是否包含或不包
含指定的元素。
"""
studentList = ['李明', 80, True]
print('李明' in studentList ) #输出：True
print(80 not in studentList ) #输出：False
print("*" * 100)

"""
2. 查找列表元素
如果要定位某元素在列表中的索引，可以使用 Python 列表内置方法 index()，语法格式
如下：
元素索引 = 列表变量名.index(元素)
"""
"""
【示例 3.2.2.2】通过列表的内置方法 index()来取得列表中指定元素的索引。
"""
student_list = ['李明', 80, True]
if 80 in student_list:
    score_index = student_list.index(80)
    print(f"学生成绩在student_list中，索引值为{score_index}")
else:
    print('列表中找不到学生对应的成绩')
print("*" * 100)

"""
3.3 编辑列表
本小节学习编辑和操纵列表元素。作为一种灵活可变的数据结构，列表可以方便的添加、
修改和删除元素，更新数据信息，满足程序的各种功能需要。
3.3.1 列表元素添加
本知识点学习向列表中添加元素。有两种方法可以向列表添加元素：一种方法是直接在
列表的最后追加新元素，其特点是不会影响列表中现有元素的索引；一种方法是指定插入新
元素的索引，在插入位置右边所有元素的索引都会发生变化。
在列表后追加新元素，语法形式如下：
列表变量名.append(新元素) 
在列表的指定索引位置插入新元素，语法形式如下：
列表变量名.insert(索引号, 新元素)
"""
"""
append练习
"""
student_list = ['李明',80, True]
print(f"未进行append操作前，内容为: {student_list}")
student_class = "数学"
student_list.append(student_class)
print(f"当前学生列表内容为: {student_list}")
print("*" * 100)

"""
insert练习
"""
student_list = ['小红',90, False]
print(f"未进行insert操作内容为: {student_list}")
student_class = "语文"
student_list.insert(1, student_class)
print(f"当前学生列表内容为: {student_list}")
print("*" * 100)

"""
3.3.2 扩展列表
本知识点学习批量向列表中添加元素，通过扩展列表来实现。扩展列表允许将两个列表
直接合并为一个列表，可以快速实现列表数据的迅速扩张。扩展列表有两种实现方法：一种
是基于列表内置方法 extend()实现，一种是基于列表加法运算实现。
基于列表内置方法 extend()的实现方式，语法形式为：
列表变量 1.extend(列表变量 2)
基于列表加法运算的实现方式，语法形式为：
列表变量 3 = 列表变量 1 + 列表变量 2
需要注意的是：基于内置方法 extend()扩展列表时，列表 2 的数据会按照索引依次被追
加到列表 1 的末尾；基于加法运算扩展列表时，会生成一个新列表。
"""
"""
extend练习
"""
list_x = ["a", "b", "c"]
list_y = ["d", "e", "f"]
# 需要注意的是：list_x使用extend()并不会创建一个新的变量，而是在原有的变量中进行扩展
list_x.extend(list_y)
print(f"list_x : {list_x}")
print("*" * 100)

"""
使用 + 练习
"""
list_x = ["a", "b", "c"]
list_y = ["d", "e", "f"]
# 注意：这里是将list_x和list_y进行组合之后，通过新的变量存储
list_xy = list_x + list_y
print(f"list_xy : {list_xy}")

print("*" * 100)

"""
3.3.3 列表元素修改
本知识点学习修改列表元素。如果要修改列表元素的值，首先需要在列表中查找需要修
改的元素，然后通过对该元素重新赋值即可。语法形式为：
列表变量名[待修改元素索引] = 元素新值
"""

list_a = ['1', '2', '4']
print(f'list_a的内容修改前为: {list_a}')
list_a[2] = '3'
print(f'list_a的内容修改后为: {list_a}')
print("*" * 100)


"""
3.3.4 列表元素删除
本知识点学习删除列表元素。在软件项目中，列表中的元素经常需要更新，失效的数据
需要及时删除以避免对程序的正常运行形成干扰。如果要删除列表中的元素，一般有 3 种方
法，可以根据实际情况选择合适的方法：
1. 通过列表内置方法 remove()删除指定的元素，语法形式为：
列表变量名.remove(待删除元素) 
2. 通过列表内置方法 pop()删除指定索引位置的元素，语法形式为：
列表变量名.pop(索引) #索引的默认值为“-1”,若不提供索引，删除列表最后一个元素
3. 通过 del 关键字，配合使用列表索引，删除指定元素，语法形式为：
del 列表变量名[元素索引号]
"""

"""
1. remove删除(按元素内容删除)
"""
list_a = ['1','2','33333']
print(f'list_a的内容删除前为: {list_a}')
list_a.remove('33333')
print(f'list_a的内容删除后为: {list_a}')
print("*" * 100)


"""
2. pop删除(按索引删除)
"""
list_a = ['1','2','33333', '44444', '55555']
print('通过pop()删除列表最后一个元素')
print(f'list_a的内容删除前为: {list_a}')
# 如果pop()中不加输入参数的话，默认为-1
list_a.pop()
print(f'list_a的内容删除后为: {list_a}')
print('通过pop(2)删除列表索引为2的元素')
print(f'list_a的内容删除前为: {list_a}')
list_a.pop(2)
print(f'list_a的内容删除后为: {list_a}')
print("*" * 100)

"""
3. del 删除（按照索引）
"""
print('del 删除')
list_a = ['1','2','33333', '44444', '55555']
print(f'list_a的内容删除前为: {list_a}')
del list_a[3]
print(f'list_a的内容删除后为: {list_a}')
